﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SIBI.Models;
using PagedList;

namespace SIBI.Controllers
{
    [Authorize]
    public class CargoController : Controller
    {
        private SIBIContext db = new SIBIContext();

        private TEJECUTIVOContext db1 = new TEJECUTIVOContext();

		
        //***********************************************************************************//
        // Autor:  										                     				*//
		//***********************************************************************************//
		// GetCargos()																		*//
		// Función que devuelve la vista de todos los cargos del sitema	para asi			*// 
		//  listarlos en las funciones de autocompletado del sistema. 						*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	query: String llenado en el autocompletado, utilizado para buscar			*//
		// 		los cargos que coincidan en BD.	 											*//
		// _________________________________________________________________________________*//
		// Salida:  Arreglo que posee todos los cargos que conciden con el String de 		*//
		// busqueda.																		*//
		// _________________________________________________________________________________*//
        [HttpPost]
        public ActionResult GetCargos(string query)
        {
			//Filtrado de los cargos por los paremetros de entrada
            var cargos = (from c1 in db.Cargoes
                          where (
                                c1.CargoId != "DEPOSITO" &&
                                    (
                                        c1.CargoId.Contains(query) ||
                                        c1.empleados.Contains(query) ||
                                        c1.division.Contains(query) ||
                                        c1.cdes.Contains(query) ||
                                        c1.ceco.Contains(query)
                                    )
                                )
                          select c1).ToList();
						  
			//Busqueda de los Ceco
            var cecos = (from c2 in db1.CECO
                         select c2).ToList();
			//Join manual entre los Ceco y los Cargos ya que pertenecen a BD diferentes
            var cc = (from c1 in cargos
                      join c2 in cecos on c1.ceco equals c2.ceco_id into JoinedCargoCeco
                      from c2 in JoinedCargoCeco.DefaultIfEmpty()
                      select new
                      {
                          CargoId = c1.CargoId,
                          Empleado = c1.empleados,
                          DivisionId = c1.division,
                          Cargo = c1.cdes,
                          CecoId = c1.ceco,
                          Correo = c1.correo,
                          Ceco = c2 != null ? c2.ceco_descripcion : null
                      }).Take(15).ToArray();

            return Json(cc); 
        }

		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// SearchIndex()	Acceso INVITADO	y ADMINISTRADOR									*//
		// Acción que devuelve la vista de todos los ítems de cargo listados, paginados y   *//
		// con opción de búsqueda.		 													*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
		// 		búsqueda, por defecto es 1.													*//
		// •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
		// 		búsqueda. 																	*//
		// •	Parámetros con prefijo current: caracteres que guardan la ultima búsqueda de*// 
		// 		filtrado para mantenerla durante los cambios de página. 					*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los cargos listados deseados.						*//
		// _________________________________________________________________________________*//
        public ActionResult SearchIndex(string currentNPer, string searchNPer, string currentEmp, string searchEmp, string currentIdPos, string searchIdPos, string currentPos, string searchPos, int? page = 1)
        {

            var car = from m in db.Cargoes
                      select m;
			
			//Metodo GET Inicializar las variables con los valores de busqueda introducidos
            if (Request.HttpMethod == "GET")
            {
                searchNPer = currentNPer;
                searchEmp = currentEmp;
                searchIdPos = currentIdPos;
                searchPos = currentPos;
            }
            else
            {
                page = 1;
            }
			
			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.CurrentNPer = searchNPer;
            ViewBag.CurrentEmp = searchEmp;
            ViewBag.CurrentIdPos = searchIdPos;
            ViewBag.CurrentPos = searchPos;

            int pageSize = 10;
            int pageIndex = (page ?? 1) - 1;

			//Filtrado por los parametros en entreda capturado en al interfaz
            if (!String.IsNullOrEmpty(searchNPer))
            {
                car = car.Where(s => s.ceco.Contains(searchNPer));
            }

            if (!String.IsNullOrEmpty(searchEmp))
            {
                car = car.Where(s => s.empleados.Contains(searchEmp));
            }

            if (!String.IsNullOrEmpty(searchIdPos))
            {
                car = car.Where(s => s.division.Contains(searchIdPos));
            }

            if (!String.IsNullOrEmpty(searchPos))
            {
                car = car.Where(s => s.cdes.Contains(searchPos));
            }

			//Ordenar los BI del return
            car = car.OrderBy(x => x.empleados);

            return View(car.ToPagedList(pageIndex, pageSize));
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// ComisionIndex()		Acceso INVITADO	y ADMINISTRADOR								*//
		// Función que devuelve la vista de todos los cargos extrenos listados en pantalla	*// 
		// _________________________________________________________________________________*//
		// Entrada: None                                        							*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los cargos listados			 					*//
		// _________________________________________________________________________________*//
        public ViewResult ComisionIndex()
        {
            var cargo = (from m in db.Cargoes
                        where m.CargoId.Contains("E")
                        select m).ToList();

            return View(cargo);
        }
       
		//***********************************************************************************//
        // Autor:  										                    				*//
		//***********************************************************************************//
		// Details()	Acceso INVITADO	y ADMINISTRADOR										*//
		// Función que devuelve la vista de los detalles de un cargo especificado.	 		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador del cargo que se desea ver los detalles. 					*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los datos del cargo desado.						*//
		// _________________________________________________________________________________*//
        [Authorize]
        public ViewResult Details(string id)
        {
            Cargo cargo = db.Cargoes.Find(id);
            return View(cargo);
        }
       
		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// Create()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista que permite crear un Cargo especificado. Método GET	*//
		// _________________________________________________________________________________*//
		// Entrada: 		none															*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee la plantilla para crear el cargo desado.				*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Create()
        {
            ViewBag.Error = false;
            return View();
        }
       
		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// Create()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista que permite crear un Cargo especificado. Método POST*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	cargo: modelo de cargo requerido para verificar que los datos suministrados *//
		// 		de cargo son correctos,  para así crear o enviar un mensaje de error en la 	*//
		//		aplicación. 																*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve el cargo creado.										*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Create(Cargo cargo)
        {
            ViewBag.Error = false;
            var validCargo = (from m in db.Cargoes
                            where m.CargoId == cargo.CargoId
                            select m.CargoId).ToList();

            if (validCargo.Count() == 0)
            {
                if (ModelState.IsValid)
                {
                    if (cargo.CargoId != null && cargo.n_personal != null && cargo.empleados != null)
                    {
                        if (cargo.CargoId.Contains("E"))
                        {
                            db.Cargoes.Add(cargo);
                            db.SaveChanges();
                            return RedirectToAction("ComisionIndex");
                        }
                        ViewBag.Error = true;
                    } else
                        ViewBag.ErrorCargo = "Cargo, Número Personal y Nombre son requeridos";
                }
            }
            else
                ViewBag.ErrorCargo = "Cargo Duplicado";

            return View(cargo);
        }
       
		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// Edit()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista que permite editar un Cargo especificado. Método GET*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador del Cargo que se desea editar.							*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee la plantilla para editar el cargo desado.				*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Edit(string id)
        {
            ViewBag.Error = false;
            
            Cargo cargo = db.Cargoes.Find(id);
            ViewBag.cargoOld = cargo.CargoId;

            return View(cargo);
        }
       
		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// Edit()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista que permite editer un Cargo especificado.Método POST*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	cargo: modelo de cargo requerido para verificar que los datos suministrados *//
		// 		de cargo son correctos,  para así editar o enviar un mensaje de error en la *//
		//		aplicación. 																*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve el cargo editado										*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Edit(Cargo cargo, string cargoOld)
        {
            ViewBag.Error = false;
            var validCargo = (from m in db.Cargoes
                              where m.CargoId == cargo.CargoId
                              select m.CargoId).ToList();

            if (validCargo.Count() == 0 || cargoOld == cargo.CargoId)
            {
                if (cargo.CargoId != null && cargo.n_personal != null && cargo.empleados != null)
                {
                    if (cargo.CargoId.Contains("E"))
                    {
                        if (ModelState.IsValid)
                        {
                            db.Entry(cargo).State = EntityState.Modified;
                            db.SaveChanges();
                            return RedirectToAction("ComisionIndex");
                        }
                    }
                    ViewBag.Error = true;
                }
                else
                    ViewBag.ErrorCargo = "Cargo, Número Personal y Nombre son requeridos";
                
            }
            else
                ViewBag.ErrorCargo = "Cargo Duplicado";

            return View(cargo);
        }

		//***********************************************************************************//
        // Autor:  										                     				*//
		//***********************************************************************************//
		// Delete()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista que permite elimininar un Cargo especificado. 		*//
		// Método GET.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador del Cargo que se desea eliminar.							*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee la plantilla para eliminar el cargo desado.				*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Delete(string id)
        {
            Cargo cargo = db.Cargoes.Find(id);
            return View(cargo);
        }

		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// DeleteConfirmed()	Acceso solo ADMINISTRADOR									*//
		// Acción que devuelve la vista que permite elimininar un Cargo especificado. 		*//
		// Método POST.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador del Cargo que va a eliminar.								*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que muestra la eliminación del cargo desado.						*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(string id)
        {
            Cargo cargo = db.Cargoes.Find(id);

            var seriales = ": ";

            var BienInformatico = from m in db.BienInformaticoes
                              where m.CargoId== cargo.CargoId
                              select m.BienInformaticoId;
            if (BienInformatico.Count() == 0)
            {
                db.Cargoes.Remove(cargo);
                db.SaveChanges();
                return RedirectToAction("ComisionIndex");
            }
            else
            {
                foreach( var Bi in BienInformatico){

                    seriales = seriales + Bi + ", ";
                }

                return RedirectToAction("Confirmacion", new { idBien = seriales });
            }
        }

		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// Confirmacion()	Acceso solo ADMINISTRADOR										*//
		// Acción que devuelve la vista que informa si el Cargo esta asociado a algún BI.	*//
		// Método GET.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	idBien: identificador de los Seriales Asociados.							*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve la pantalla de los seriaels asociados.				*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ViewResult Confirmacion(string idBien)
        {
            ViewBag.BienInformatico = idBien;
            return View();
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

    }
}
